﻿(function () {
    var qipanUtilsFn = function ($, moment) {
        // 正则集合
        var reg = {
            mobile: /^1[\d]{10}$/, // 手机号
            email: /^([a-zA-Z0-9_\.\-])+@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/, // 邮箱
            name: /^[a-zA-Z0-9_]+$/,  // 只能包含大写、小写、数字和下划线
            number: /^[0-9]*$/,  // 匹配非数字  -- 原来用错了。
            isNumber: /[^0-9]/g, // 匹配纯数字
            money: /^\d+(\.\d+)?$/, // 匹配纯数字有且只有一个小数点
            idCard: /^([0-9]{17}[0-9X]{1})|([0-9]{15})$/  // 身份证
        };
        // 浮点数加法 a + b
        function accAdd(a, b) {
            var c, d, e;
            try {
                c = a.toString().split(".")[1].length;
            } catch (f) {
                c = 0;
            }
            try {
                d = b.toString().split(".")[1].length;
            } catch (f) {
                d = 0;
            }
            return e = Math.pow(10, Math.max(c, d)), (accMul(a, e) + accMul(b, e)) / e;
        }

        // 浮点数减法 a - b
        function accSub(a, b) {
            var c, d, e;
            try {
                c = a.toString().split(".")[1].length;
            } catch (f) {
                c = 0;
            }
            try {
                d = b.toString().split(".")[1].length;
            } catch (f) {
                d = 0;
            }
            return e = Math.pow(10, Math.max(c, d)), (accMul(a, e) - accMul(b, e)) / e;
        }

        // 浮点数乘法 a * b
        function accMul(a, b) {
            var c = 0,
                d = a.toString(),
                e = b.toString();
            try {
                c += d.split(".")[1].length;
            } catch (f) {
            }
            try {
                c += e.split(".")[1].length;
            } catch (f) {
            }
            return Number(d.replace(".", "")) * Number(e.replace(".", "")) / Math.pow(10, c);
        }

        // 浮点数除法 a / b
        function accDiv(a, b) {
            var c, d, e = 0,
                f = 0;
            try {
                e = a.toString().split(".")[1].length;
            } catch (g) {
            }
            try {
                f = b.toString().split(".")[1].length;
            } catch (g) {
            }
            return c = Number(a.toString().replace(".", "")), d = Number(b.toString().replace(".", "")), accMul(c / d, Math.pow(10, f - e));
        }

        //给url编码
        //escape() @ * / +
        //encodeURL() ! @ # $& * ( ) = : / ; ? + '
        //encodeURIComponent() ! * ( ) '
        function encodeUrl(url) {
            return encodeURIComponent(url);
        }

        //给url解码
        //
        //decodeURI
        //decodeURIComponent
        function decodeUrl(url) {
            return decodeURIComponent(url);
        }

        // 获取qq的客服通信链接
        function getQQContact(qq) {
            if (!qq) {
                return;
            }
            return 'http://wpa.qq.com/msgrd?v=3&uin=' + qq + '&site=qq&menu=yes';
        }

        function format() {
            ///	<summary>
            ///	字符串格式化。第一个参数是格式，第二个参数是格式化的第一个参数，第三个参数是格式化的第二个参数...
            /// var fmt = "Hello {0}!";Swao.utils.String.format(fmt, "Andrew");
            ///	</summary>
            ///	<param name="str" type="String">输入字符串</param>
            ///	<returns type="int">字符串长度(中文2个字符)</returns>

            if (arguments.length == 0)
                return null;
            var str = arguments[0];
            var re = '', i = 0;
            // 如果第二个参数是数组
            if ($.isArray(arguments[1])) {
                var array = arguments[1];
                for (; i < array.length; i++) {
                    re = new RegExp('\\{' + i + '\\}', 'gm');
                    str = str.replace(re, array[i]);
                }
            } else {
                for (i = 1; i < arguments.length; i++) {
                    re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
                    str = str.replace(re, arguments[i]);
                }
            }
            return str;
        }

        // 获取新开窗口的窗口配置参数
        // 宽高百分比数值使用范围 0 -100
        function getNewWindowConfig(widthPencent, heightPencent) {
            var widthPencent = widthPencent || 80;
            var heightPencent = heightPencent || 80;
            var W = $(window).width();
            var H = $(window).height();
            var wp = accDiv(widthPencent, 100);
            var hp = accDiv(heightPencent, 100);
            var tp = accDiv(accSub(1, hp), 2);
            var lp = accDiv(accSub(1, wp), 2);
            var windowConfig = 'height=' + (accMul(H, hp)) + ',width=' + (accMul(W, wp)) + ',top=' + (accMul(H, tp)) + ',left=' + (accMul(W, lp)) + ',toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no, status=no';
            return windowConfig;
        }

        // 编码转换，默认转换为16进制
        function convertCode(data, num) {
            var num = num || 16;
            var str = '';
            for (var i = 0, len = data.length; i < len; i++) {
                str += data.charCodeAt(i).toString(num);
            }
            return str;
        }

        // 去除值中的非数字
        function fixedNumber(value) {
            return value.replace(reg.isNumber, "");
        }

        // 获取url中的参数
        // 若指定key，则仅返回key对应的值
        function getLocationData(key) {
            var paramStr = window.location.search.substring(1);
            var result = null;
            var params, paramArr;
            if (paramStr.length > 0) {
                params = paramStr.split("&");
                if (typeof key == 'undefined') {
                    result = {};
                    for (var i = 0; i < params.length; i++) {
                        paramArr = params[i].split("=");
                        result[paramArr[0]] = paramArr[1];
                    }
                    if ($.isEmptyObject(result)) {
                        result = null;
                    }
                } else {
                    for (var j = 0; j < params.length; j++) {
                        paramArr = params[j].split("=");
                        var indexKey = paramArr[0];
                        if (key == indexKey) {
                            result = paramArr[1];
                        }
                    }
                }
            }
            return result;
        }

        // 设置url中参数的值，重新返回一个新的url地址
        function getResetLocation(key, value) {
            var data = getLocationData() || {};
            var thisLocation = window.location.href;
            var aheadLocation = '';
            var lastLocation = '';
            if (thisLocation.indexOf('?') > -1) {
                aheadLocation = thisLocation.split('?')[0];
            } else if (thisLocation.indexOf('#') > -1) {
                aheadLocation = thisLocation.split('#')[0];
            } else {
                aheadLocation = thisLocation;
            }

            if (thisLocation.indexOf('#') > -1) {
                lastLocation = '#' + thisLocation.split('#')[1];
            }

            var location = aheadLocation + '?';

            data[key] = value;
            for (var name in data) {
                location += (name + '=' + data[name] + '&');
            }
            location = location.substring(0, location.length - 1) + lastLocation;
            return location;
        }

        // 根据类型获取日期间隔
        // beginTime 起始时间  endTime 结束时间
        // type  日  时 分 秒 类型
        function getDateInterval(beginTime, endTime, type) {
            if (typeof type == 'undefined') {
                return;
            }
            beginTime = parseInt(beginTime);
            endTime = parseInt(endTime);
            switch (type) {
                case 'day':
                    return Math.abs(endTime - beginTime) / 1000 / 60 / 60 / 24;
                case 'hour':
                    return Math.abs(endTime - beginTime) / 1000 / 60 / 60;
                case 'minutes':
                    return Math.abs(endTime - beginTime) / 1000 / 60;
                case 'seconds':
                    return Math.abs(endTime - beginTime) / 1000;
            }

        }

        // 本地存储- 存储  并设置过期分钟
        function setCookie(key, data, minutes) {
            var d = {};
            d.data = data;
            if (!!minutes) {
                d.beginTime = (new Date()).getTime();
                d.effectiveMin = minutes;
            }
            d = JSON.stringify(d);
            window.localStorage.setItem(key, d);
        }

        // 本地存储- 获取
        function getCookie(key) {
            if (!!window.localStorage.getItem(key)) {
                var d = $.parseJSON(window.localStorage.getItem(key));
                var endTime = (new Date()).getTime();
                if (!!d.beginTime) {
                    if (getDateInterval(d.beginTime, endTime, 'minutes') > parseInt(d.effectiveMin)) {
                        window.localStorage.removeItem(key);
                        return null;
                    } else {
                        if (typeof d.data != 'undefined') {
                            return d.data;
                        } else {
                            window.localStorage.removeItem(key);
                            return null;
                        }
                    }
                } else {
                    if (!!d.data) {
                        return d.data;
                    }
                }
            }
            return null;
        }

        // 本地存储- 获取
        function removeCookie(key) {
            if (!!window.localStorage.getItem(key)) {
                window.localStorage.removeItem(key);
            }
        }

        // 判断 字符串是否为空或者null
        // 如果 为真 返回true
        // 如果 为假 返回false
        function stringIsNullOrEmpty(text) {
            return (typeof text == 'undefined') || (text == null) || stringIsEmpty(text);
        }

        function stringIsEmpty(text) {
            return !(typeof text == 'string' && text != '');

        }

        // 判断父字符串中 是否包含指定字符串
        function stringContains(text, matchText) {
            return text.indexOf(matchText) > -1;
        }

        //判断是否是数组
        function isArray(obj) {
            return Object.prototype.toString.call(obj) === '[object Array]';
        };

        //判断是否是function
        function isFunc(obj) {
            return Object.prototype.toString.call(obj) === '[object Function]';
        }

        // 是否是json对象
        function isJson(obj) {
            return typeof (obj) == "object" && (isArray(obj) || Object.prototype.toString.call(obj).toLowerCase() == "[object object]");
        }

        //  number  function  string object undefined  boolean
        //  处理字符串json 或者 字符串数组
        function parseJson(data) {
            if (typeof data == 'undefined' || data == null) {
                return null;
            } else if (isJson(data)) {
                return data;
            } else {
                try {
                    return JSON.parse(data);
                } catch (e) {
                    console.log('parseJson function is fail.', e);
                    return data;
                }
            }
        }

        // 生成查询字符串
        function genQueryString(keyArray, valueArray) {
            var result = '';
            for (var i = 0, len = keyArray.length; i < len; i++) {
                // 只判断 undefined 和 null 不考虑 '' 和 true  false 及 {}
                if (typeof valueArray[i] != 'undefined' && valueArray[i] != null) {
                    // 如果是对象，则将对象转化成字符串对象
                    if (typeof valueArray[i] == 'object') {
                        result += (keyArray[i] + '=' + JSON.stringify(valueArray[i]) + '&');
                    } else {
                        result += (keyArray[i] + '=' + valueArray[i] + '&');
                    }
                }
            }
            result = result.substring(0, result.length - 1);
            return result;
        }

        // 获取最近的月份
        function getRecentMonth(value) {
            value = value || 1;
            var begin = moment(moment().subtract(value, 'month').calendar()).format("YYYY-MM-DD");
            var end = moment().format('YYYY-MM-DD');
            return [begin, end];
        }

        // 获取最近的周
        function getRecentWeek(value) {
            value = value || 1;
            var begin = moment(moment().subtract(value, 'week').calendar()).format("YYYY-MM-DD");
            var end = moment().format('YYYY-MM-DD');
            return [begin, end];
        }


        //保留小数
        //默认将值处理成固定两位小数
        //如果传入指定保留小数位数，则按指定数处理
        //若为整数，则补0
        function genDecimal(number, n) {
            var len = !!n ? n : 2;
            return parseFloat(number).toFixed(len)
        }

        // 小数转换为百分比
        function toPercent(decimal) {
            return accMul(parseFloat(decimal), 100) + '%';
        }

        return {
            accAdd: accAdd, // 浮点数加法
            accSub: accSub, // 浮点数减法
            accMul: accMul, // 浮点数乘法
            accDiv: accDiv, // 浮点数除法
            encodeUrl: encodeUrl,
            decodeUrl: decodeUrl,
            getQQContact: getQQContact,
            format: format,
            getNewWindowConfig: getNewWindowConfig,
            convertCode: convertCode,
            reg: reg,
            fixedNumber: fixedNumber,
            getLocationData: getLocationData,
            getDateInterval: getDateInterval,
            setCookie: setCookie,
            getCookie: getCookie,
            removeCookie: removeCookie,
            stringIsNullOrEmpty: stringIsNullOrEmpty,
            stringIsEmpty: stringIsEmpty,
            stringContains: stringContains,
            getResetLocation: getResetLocation,
            isJson: isJson,
            parseJson: parseJson,
            genQueryString: genQueryString,
            getRecentMonth: getRecentMonth,
            getRecentWeek: getRecentWeek,
            toPercent: toPercent,
            genDecimal: genDecimal
        }
    };
    if (typeof require != 'undefined') {
        define(['jquery', 'moment'], function ($, moment) {
            return qipanUtilsFn($, moment);
        })
    } else {
        window.qipanUtils = qipanUtilsFn($, moment);
    }
})();